#define IN1 14  // 电机A 正转引脚
#define IN2 12  // 电机A 反转引脚
#define IN3 27  // 电机B 正转引脚
#define IN4 26  // 电机B 反转引脚

int speed = 255; // 默认速度（0-255），越低速度越慢
bool isMoving = false; // 电机是否在运动的状态

void setup() {
  Serial.begin(115200); // 初始化串口通信
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
}

void loop() {
  if (Serial.available()) {
    char command = Serial.read(); // 读取串口输入

    switch (command) {
      case 'f': // 前进
        isMoving = true;
        moveForward();
        break;
      case 'b': // 后退
        isMoving = true;
        moveBackward();
        break;
      case 'l': // 左转
        isMoving = true;
        turnLeft();
        break;
      case 'r': // 右转
        isMoving = true;
        turnRight();
        break;
      case 's': // 停止
        isMoving = false;
        stopMotors();
        break;
      case 'v': // 设置速度
        if (Serial.available()) {
          speed = Serial.parseInt(); // 读取速度值
          speed = constrain(speed, 0, 255); // 限制速度范围
          Serial.print("Speed set to: ");
          Serial.println(speed);
        }
        break;
      default:
        stopMotors(); // 未知指令时停止
        break;
    }
  }

  // 如果电机在运动中，继续转动
  if (isMoving) {
    delay(100); // 稍微延迟以避免过快循环
  } else {
    stopMotors(); // 未输入时停止
  }
}

void moveForward() {
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  delay(map(speed, 0, 255, 2000, 100)); // 根据速度调整运行时间
}

void moveBackward() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  delay(map(speed, 0, 255, 2000, 100)); // 根据速度调整运行时间
}

void turnLeft() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH); // 左轮反转
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);  // 右轮正转
  delay(map(speed, 0, 255, 2000, 100)); // 根据速度调整运行时间
}

void turnRight() {
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);  // 左轮正转
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);  // 右轮反转
  delay(map(speed, 0, 255, 2000, 100)); // 根据速度调整运行时间
}

void stopMotors() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
}
